home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / bsfengines.jar / com / ibm / bsf / engines / activescript / JavaBean.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-12-09  |  5.4 KB  |  217 lines

  1. package com.ibm.bsf.engines.activescript;
  2.  
  3. import com.ibm.bsf.BSFException;
  4. import com.ibm.bsf.util.EngineUtils;
  5. import java.beans.BeanInfo;
  6. import java.beans.EventSetDescriptor;
  7. import java.beans.Introspector;
  8. import java.beans.PropertyDescriptor;
  9. import java.io.PrintWriter;
  10. import java.io.StringWriter;
  11. import java.lang.reflect.Field;
  12. import java.lang.reflect.InvocationTargetException;
  13. import java.lang.reflect.Method;
  14. import java.util.Vector;
  15.  
  16. public final class JavaBean {
  17.    private static Vector lsMembers = new Vector(512, 512);
  18.    private static final short DISPATCH_METHOD = 1;
  19.    private static final short DISPATCH_PROPERTYGET = 2;
  20.    private static final short DISPATCH_PROPERTYPUT = 4;
  21.    private static final short DISPATCH_PROPERTYPUTREF = 8;
  22.    private static final short DISPATCH_CASESENSITIVE = 64;
  23.    private static final short DISPATCH_THROWEXCEPTION = 128;
  24.  
  25.    public static final int bindMember(Class var0, String var1) throws Exception {
  26.       return bindMember(var0, var1, (short)7);
  27.    }
  28.  
  29.    public static final int bindMember(Class var0, String var1, short var2) throws Exception {
  30.       Object var3 = null;
  31.       boolean var4 = (var2 & 128) != 0;
  32.       boolean var5 = (var2 & 64) != 0;
  33.       boolean var6 = (var2 & 1) != 0;
  34.       boolean var7 = (var2 & 2) != 0;
  35.       boolean var8 = (var2 & 4) != 0 || (var2 & 8) != 0;
  36.       if (!var6 && !var7 && !var8) {
  37.          var8 = true;
  38.          var7 = true;
  39.          var6 = true;
  40.       }
  41.  
  42.       if (var6 || var7 || var8) {
  43.          Method[] var9 = var0.getMethods();
  44.  
  45.          for(int var10 = 0; var10 < var9.length; ++var10) {
  46.             if (var5 ? var9[var10].getName().equals(var1) : var9[var10].getName().equalsIgnoreCase(var1)) {
  47.                if (var3 == null) {
  48.                   var3 = var9[var10];
  49.                } else if (var3 instanceof Method) {
  50.                   if (var9[var10].getName().equals(((Method)var3).getName())) {
  51.                      var3 = var9[var10].getName();
  52.                      if (var5) {
  53.                         var10 = var9.length;
  54.                      }
  55.                   } else if (!var5) {
  56.                      if (var4) {
  57.                         throw new BSFException(BSFException.REASON_OTHER_ERROR, "Method:" + var1 + " in " + var0 + "differs between two methods in case only, can't distiguish");
  58.                      }
  59.  
  60.                      return 0;
  61.                   }
  62.                } else if (!var9[var10].getName().equals((String)var3) && !var5) {
  63.                   if (var4) {
  64.                      throw new BSFException(BSFException.REASON_OTHER_ERROR, "Method:" + var1 + " in " + var0 + "differs between two methods in case only, can't distiguish");
  65.                   }
  66.  
  67.                   return 0;
  68.                }
  69.             }
  70.          }
  71.  
  72.          if (var3 != null) {
  73.             lsMembers.addElement(var3);
  74.             return lsMembers.size() - 1;
  75.          }
  76.  
  77.          if (!var8 && !var7) {
  78.             if (var4) {
  79.                throw new BSFException(BSFException.REASON_OTHER_ERROR, "Method:" + var1 + " in " + var0 + "not found.");
  80.             }
  81.  
  82.             return 0;
  83.          }
  84.       }
  85.  
  86.       BeanInfo var14 = null;
  87.       if (var8 || var7) {
  88.          Field[] var15 = var0.getFields();
  89.  
  90.          for(int var11 = 0; var11 < var15.length; ++var11) {
  91.             if (var5 ? var15[var11].getName().equals(var1) : var15[var11].getName().equalsIgnoreCase(var1)) {
  92.                if (var3 != null) {
  93.                   if (var4) {
  94.                      throw new BSFException(BSFException.REASON_OTHER_ERROR, "Field:" + var1 + " in " + var0 + "differs between two fields in case only, can't distinguish");
  95.                   }
  96.  
  97.                   return 0;
  98.                }
  99.  
  100.                var3 = var15[var11];
  101.                if (var5) {
  102.                   var11 = var15.length;
  103.                }
  104.             }
  105.          }
  106.  
  107.          if (var3 != null) {
  108.             lsMembers.addElement(var3);
  109.             return -(lsMembers.size() - 1);
  110.          }
  111.  
  112.          var14 = Introspector.getBeanInfo(var0);
  113.          PropertyDescriptor[] var12 = var14.getPropertyDescriptors();
  114.  
  115.          for(int var13 = 0; var13 < var12.length; ++var13) {
  116.             if (var5 ? var12[var13].getName().equals(var1) : var12[var13].getName().equalsIgnoreCase(var1)) {
  117.                if (var3 != null) {
  118.                   if (var4) {
  119.                      throw new BSFException(BSFException.REASON_OTHER_ERROR, "Field:" + var1 + " in " + var0 + "differs between two fields in case only, can't distinguish");
  120.                   }
  121.  
  122.                   return 0;
  123.                }
  124.  
  125.                var3 = var12[var13];
  126.                if (var5) {
  127.                   var13 = var12.length;
  128.                }
  129.             }
  130.          }
  131.  
  132.          if (var3 != null) {
  133.             lsMembers.addElement(var3);
  134.             return -(lsMembers.size() - 1);
  135.          }
  136.       }
  137.  
  138.       if (var8 && var1.length() > 2 && (var5 ? var1.substring(0, 2).equals("on") : var1.substring(0, 2).equalsIgnoreCase("on"))) {
  139.          String var16 = var1.substring(2);
  140.          EventSetDescriptor[] var17 = var14.getEventSetDescriptors();
  141.  
  142.          for(int var18 = 0; var18 < var17.length; ++var18) {
  143.             if (var5 ? var17[var18].getName().equals(var16) : var17[var18].getName().equalsIgnoreCase(var16)) {
  144.                if (var3 != null) {
  145.                   if (var4) {
  146.                      throw new BSFException(BSFException.REASON_OTHER_ERROR, "Event:" + var1 + " in " + var0 + "differs between two fields in case only, can't distinguish");
  147.                   }
  148.  
  149.                   return 0;
  150.                }
  151.  
  152.                var3 = var17[var18];
  153.                if (var5) {
  154.                   var18 = var17.length;
  155.                }
  156.             }
  157.          }
  158.  
  159.          if (var3 != null) {
  160.             lsMembers.addElement(var3);
  161.             return -(lsMembers.size() - 1);
  162.          }
  163.       }
  164.  
  165.       if (var4) {
  166.          throw new BSFException(BSFException.REASON_OTHER_ERROR, "No method, property, or event matches " + var1 + " in " + var0 + ".");
  167.       } else {
  168.          return 0;
  169.       }
  170.    }
  171.  
  172.    public static final Object callMethod(JavaBeanAddEventListener var0, Object var1, int var2, Object[] var3) throws Exception {
  173.       Object var4 = null;
  174.       if (var2 > 0) {
  175.          Object var5 = lsMembers.elementAt(var2);
  176.          if (var5 instanceof Method) {
  177.             try {
  178.                var4 = ((Method)var5).invoke(var1, var3);
  179.             } catch (InvocationTargetException var10) {
  180.                Throwable var7 = var10.getTargetException();
  181.                StringWriter var8 = new StringWriter();
  182.                PrintWriter var9 = new PrintWriter(var8);
  183.                var7.printStackTrace(var9);
  184.                throw new BSFException(BSFException.REASON_OTHER_ERROR, "Target method exception(" + var7 + ") message is: " + var7.getMessage() + "stack trace" + var8.toString(), var7);
  185.             }
  186.          } else {
  187.             var4 = EngineUtils.callBeanMethod(var1, (String)var5, var3);
  188.          }
  189.       } else {
  190.          Object var11 = lsMembers.elementAt(-var2);
  191.          if (var11 instanceof PropertyDescriptor) {
  192.             PropertyDescriptor var6 = (PropertyDescriptor)var11;
  193.             if (var3.length > 0) {
  194.                var4 = var6.getWriteMethod().invoke(var1, var3);
  195.             } else {
  196.                var4 = var6.getReadMethod().invoke(var1, var3);
  197.             }
  198.          } else if (var11 instanceof Field) {
  199.             Field var12 = (Field)var11;
  200.             if (var3.length > 0) {
  201.                var12.set(var1, var3[0]);
  202.             } else {
  203.                var4 = var12.get(var1);
  204.             }
  205.          } else if (var3.length > 0) {
  206.             var0.addEventListener(var1, ((EventSetDescriptor)var11).getName(), (String)null, var3[0].toString());
  207.          }
  208.       }
  209.  
  210.       return var4;
  211.    }
  212.  
  213.    static {
  214.       lsMembers.addElement("");
  215.    }
  216. }
  217.